package com.example.demo.tools;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-30
 * Time: 9:03
 */

// 封装 Pinyin4j 中将一个汉字转为拼音的功能, 并且提供字符串转换
public class PinyinTools {

    /**
     * 封装拼音工具类, 将一个字符串转为拼音
     * TODO: 需要注意的是, 由于存在多音字的情况, 因此这里是一个 String[], 直接返回 0 下标位置的值, 通常为多音中常用的那个字的拼音
     * @param src 传入字符串(中文)
     * @param fullSpell 是否需要全拼 例如: 张 全拼为 zhang, 此时 fullSpell 为 false
     *                  不需要全拼为 z, 此时 fullSpell 为 true
     * @return 返回这个字符串的拼音结果
     */
    public static String get(String src, boolean fullSpell) {

        // trim() 去除两侧空的空格
        if(src == null || src.trim().length() == 0) {
            return null;
        }

        // 约定输出格式, 将 Pinyin4j 中输出的 ü 输出为 v, 在用户输入时常用为 v
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setVCharType(HanyuPinyinVCharType.WITH_V);

        // 遍历字符串的每个字符, 针对每个字符分别进行转换, 并把转换后得到拼音的结果拼接到 StringBuillder 中
        StringBuilder stringBuilder = new StringBuilder();

        for(int i = 0; i < src.length(); i++) {
            char ch = src.charAt(i);
            String[] result = null;
            try {
                result = PinyinHelper.toHanyuPinyinStringArray(ch, format); // 将 format 加入进行转换使用
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }

            if(result == null || result.length == 0) {
                // 如果结果是一个空数组, 转换失败
                // 输入的字符没有对应汉语拼音, 转换失败, 例如 a, b, c 这样的字符
                // 这种情况下, 直接将这个无法转换的字符直接保存下来
                stringBuilder.append(ch);
            } else if(fullSpell) {
                // 当前字符有拼音结果, 并且要获取全拼
                // 采取特殊处理, 该字符串有多音拼音的可能, 因此直接返回 0 下标通常为常用的拼音
                stringBuilder.append(result[0]);
            }else {
                // 当前字符有拼音结果, 并且不需要全拼
                // 同时也有多音问题, 返回 0 下标, 不需要全拼则返回 0 下标值的第一个字符
                // 绿 : 拼音有 lv lu 返回 0 下标为 lv, 必须要全拼结果则为 l
                stringBuilder.append(result[0].charAt(0));
            }
        }

        // 返回的是 String 类型, 而这里是一个 StringBuilder 类型, 需要转换
        return stringBuilder.toString();
    }
}
